package com.tennis.tennisreservation.service;

import com.tennis.tennisreservation.entity.User;

import java.util.List;
import java.util.Optional;

/**
 * 用户服务接口
 * 定义用户相关的业务逻辑方法
 */
public interface UserService {

    /**
     * 获取用户列表
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @param keyword 关键词（用户名或手机号）
     * @return 用户列表
     */
    List<User> getUserList(Integer pageNum, Integer pageSize, String keyword);
    
    /**
     * 统计用户总数
     * @param keyword 关键词（用户名或手机号）
     * @return 用户总数
     */
    long countUsers(String keyword);
    
    /**
     * 删除用户
     * @param id 用户ID
     */
    void deleteUser(Long id);

    /**
     * 根据手机号查询用户
     * @param phone 用户手机号
     * @return 用户对象（可为空）
     */
    Optional<User> findByPhone(String phone);
    
    /**
     * 根据ID查询用户
     * @param id 用户ID
     * @return 用户对象（可为空）
     */
    Optional<User> findById(Long id);
    
    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return 用户对象（可为空）
     */
    Optional<User> findByUsername(String username);

    /**
     * 保存用户信息
     * @param user 用户对象
     * @return 保存后的用户对象
     */
    User saveUser(User user);

     /**
     * 用户注册
     * @param phone 用户手机号
     * @return 注册后的用户信息
     */
    User register(String phone);

    /**
     * 用户登录（手机号登录，已废弃）
     * @param phone 用户手机号
     * @return 登录的用户信息
     */
    User login(String phone);  // 登录方法
    
    /**
     * 用户名密码登录
     * @param username 用户名
     * @param password 密码
     * @return 登录的用户信息
     */
    User loginByUsername(String username, String password);

    /**
     * 获取所有用户（不分页）
     * @return 所有用户列表
     */
    List<User> getAllUsers();
    
    /**
     * 更新用户余额
     * @param userId 用户ID
     * @param rechargeBalance 充值余额
     * @param giftBalance 赠送余额
     * @return 更新后的用户信息
     */
    User updateUserBalance(Long userId, String rechargeBalance, String giftBalance);
}
